package com.gxa.hualian.controller;

import com.gxa.hualian.utils.JsonResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.UUID;

/**
 * MultipartFile: Spring MVC 封装接收前端传输的文件的对象,会被直接注入到参数中
 * 在参数中还自动注入了HttpServletRequest对象，目的是为了获取服务器的根路径(realPath)
 * 同时利用该对象的transferTo(File)方法(封装了流操作):将接收到的二进制流信息写入到目标File中
 * @author 10076
 */
@RestController
public class UploadController {
    @RequestMapping("/upload")
    public Map upload(@RequestParam("file") MultipartFile multipartFile,
            @ApiIgnore HttpServletRequest request) throws IOException {
//QQ截图20200724153059.png
        String originalFilename = multipartFile.getOriginalFilename();
        System.out.println("originalFilename:"+originalFilename);
// 从原始文件名中获取后缀,作为新添加的文件的文件名后缀(匹配)
        String subfix =originalFilename.substring(originalFilename.indexOf(".")+1);
        System.out.println("subfix:"+subfix);
//使用UUID作为文件名,保证服务器中存放的文件名唯一
        String targetFile = UUID.randomUUID().toString().replace("-","")+"."+subfix;
                System.out.println("targetFile:"+targetFile);
// 通过request获取当前程序的根路径"/"
        String path =request.getSession().getServletContext().getRealPath("/");
        System.out.println(path);
        String fileName = path+"/images/uploadImg/"+targetFile;
        System.out.println("fileName:"+fileName);
// 构建文件对象
        File uploadFile = new File(fileName);
//核心操作(含有异常操作, 利用异常设定状态码(和前端约定)
// 此处应当和ExceptionController结合, 当try执行成功则设定状态码0
// 出现异常则设定其他
// 再将异常信息结合BusinessException抛出, 交给ExceptionController处理
        try {
            multipartFile.transferTo(uploadFile);
        } catch (IOException e) {
//e.printStackTrace();
            throw e;
        }
        JsonResult jsonResult = new JsonResult();
// 返回状态:1 表示上传成功
        jsonResult.setCode("1");
        jsonResult.setMsg("上传成功");
// 返回服务器保存后的文件名
        jsonResult.set("fileName",targetFile);
        return jsonResult.getMap();
    }
}

